10.1 Maximiere den Rand, aber soft#
Lernziele
Sie kennen die Abkürzung SVM für Support Vector Machines.
Sie kennen die Idee, bei Support Vector Machines den Margin (= Randabstand) zu maximieren.
Sie wissen, was Stützvektoren bzw. Support Vectors sind.
Sie wissen, dass ein harter Randabstand nur bei linear trennbaren Datensätzen möglich ist.
Sie wissen, dass eigentlich nicht trennbare Datensätzen mit der Technik Soft Margin (= weicher Randabstand) dennoch klassifiziert werden können.
Welche Trenn-Gerade soll es sein?#
Mit Support Vactor Machines (SVM) wollen wir erneut binäre Klassifikationsprobleme lösen. Bisher haben wir bereits das Perzeptron und das logistische Regressionsmodell kennengelernt. Liegen nur wenige Datensätze vor, so ist das logistische Regressionsmodell empfehlenswert. Bei größeren Mengen an Trainingsdaten skaliert das SVM-Verfahren jedoch besser. Auch neigt es weniger zu Overfitting. Daher lohnt es sich, Support Vector Machines anzusehen.
Warum es weniger zu Overfitting neigt und mit Ausreißern besser umgehen kann,
sehen wir bereits an der zugrundeliegenden Idee, die hinter dem Verfahren
steckt. Um das Basis-Konzept der SVMs zu erläutern, besorgen wir uns zunächst
künstliche Messdaten. Dazu verwenden wir die Funktion make_blobs aus dem
Scikit-Learn-Modul. Mehr Details zum Aufruf der Funktion finden Sie in der
Scikit-Learn-Dokumentation/make_blobs.
from sklearn.datasets import make_blobs
# generate artificial data
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.50)
print(X)
print(y)
[[ 1.4726926 1.3480769 ]
[ 0.5323772 3.31338909]
[ 1.74265969 5.03846671]
[ 1.72330962 4.2012082 ]
[ 0.4519936 3.59377836]
[ 1.84845803 0.52393625]
[ 1.61986895 0.60823883]
[ 1.62465468 1.85269614]
[ 3.01673853 1.63792106]
[ 2.23345072 1.25095024]
[ 1.60161834 0.92363636]
[ 0.802314 4.38196181]
[ 2.11872357 1.09865834]
[ 1.05374379 4.49286859]
[ 0.16932115 4.19741719]
[ 0.92466065 4.50908658]
[ 1.42002502 1.38236201]
[ 0.12313498 5.27917503]
[ 1.85367905 1.5088862 ]
[ 1.89949126 0.92574633]
[ 0.96217896 4.51795326]
[ 1.35678894 4.36462484]
[ 0.72144399 4.08475018]
[ 0.64003985 4.12401075]
[ 2.99684287 0.22378413]
[ 0.56969694 3.44064603]
[ 0.78260667 4.15263595]
[ 1.45131429 4.22810872]
[-0.30022483 4.63059663]
[ 1.59141542 4.90497725]
[ 1.92126584 1.29889186]
[ 2.14398059 0.69677319]
[ 2.20438661 1.56085661]
[ 0.99914934 4.2101954 ]
[ 1.91004907 3.81514839]
[ 1.19820169 4.47062449]
[ 2.79939362 1.84560825]
[ 0.72086751 3.71347124]
[ 1.51989121 1.42488952]
[ 2.62496786 0.28025075]
[ 2.4198128 0.96215512]
[ 0.3498724 4.69253251]
[ 2.24348029 0.34796326]
[ 1.13280393 3.87673946]
[ 0.65910903 4.12241674]
[ 2.11114739 3.57660449]
[ 2.52889351 0.82015861]
[ 1.24016835 1.12905479]
[ 2.989047 1.35068599]
[ 2.15940501 1.38598318]
[ 1.46870582 1.86947425]
[ 1.00952869 4.45502328]
[ 2.06051753 1.79059891]
[ 1.04829186 5.03092408]
[ 0.5285368 4.49723858]
[ 2.64465731 0.80770124]
[ 2.36230721 1.358767 ]
[ 1.40848818 3.93270482]
[ 2.28809874 0.12954182]
[ 2.25643834 0.55525861]]
[1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1
0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1]
Die Funktion make_blobs erzeugt standardmäßig zwei Input-Features, da die
Option n_features auf den Wert 2 voreingestellt ist, und einen Output, bei dem
die Labels entweder durch 0 oder 1 gekennzeichnet sind. Durch die Option
random_state=0 wird der Zufall ausgeschaltet.
Wenn wir die Daten visualisieren, erhalten wir folgenden Plot.
import plotly.express as px
fig = px.scatter(x = X[:,0], y = X[:,1], color=y, color_continuous_scale=['#3b4cc0', '#b40426'],
title='Künstliche Daten',
labels={'x': 'Feature 1', 'y': 'Feature 2'})
fig.show()
Wir können uns jetzt verschiedene Geraden vorstellen, die die blauen Punkte von den roten Punkten trennen. In der folgenden Grafik sind drei eingezeichnet. Welche würden Sie nehmen und warum?
Fig. 12 Drei Geraden trennen die roten von den blauen Punkten, aber welche ist die bessere Wahl?#
Alle drei Geraden trennen die blauen von den roten Punkten. Jedoch könnte Gerade 3 problematisch werden, wenn beispielsweise ein neuer blauer Datenpunkt an der Position (2.3, 3.3) dazukäme. Dann würde Gerade 3 diesen Punkt als rot klassifizieren. Ähnlich verhält es sich mit Gerade 1. Ein neuer blauer Datenpunkt an der Position (0.5, 3) würde fälschlicherweise als rot klassifiziert werden. Gerade 2 bietet den sichersten Abstand zu den bereits vorhandenen Datenpunkten. Wir können diesen “Sicherheitsstreifen” folgendermaßen visualisieren.
Fig. 13 Ein Sicherheitsstreifen bzw. breiter Rand, im Englischen Margin genannt, trennt die beiden Klassen.#
Der Support-Vector-Algorithmus sucht nun die Gerade, die die Datenpunkte mit dem größten Randabstand (= Margin) voneinander trennt. Im Englischen sprechen wir daher auch von Large Margin Classification. Die Suche nach dieser Geraden ist dabei etwas zeitaufwändiger als die Berechnung der Gewichte bei der logistischen Regression. Wenn aber einmal das Modell trainiert ist, ist die Prognose effizienter, da nur die sogenannten Stützvektoren, auf englisch Support Vectors gespeichert und ausgewertet werden. Die Stützvektoren sind die Vektoren, die vom Ursprung des Koordinatensystems zu den Punkten zeigen, die auf der Grenze des Sicherheitsbereichs liegen.
Fig. 14 Einige wenige Punkte (gelb markiert) bestimmen den Verlauf des Randabstandes. Die Vektoren, die vom Ursprung des Koordinatensystems zu diesen Punkten zeigen, werden Stützvektoren (= Support Vectors) genannt.#
Großer, aber weicher Randabstand#
Bei dem oben betrachteten Beispiel lassen sich blaue und rote Datenpunkte
komplett voneinander trennen. Für den Fall, dass einige wenige Datenpunkte
“falsch” liegen, erlauben wir Ausnahmen. Wie viele Ausnahmen wir erlauben
wollen, die im Sicherheitsstreifen liegen, steuern wir mit dem Parameter C.
Ein großes C bedeutet, dass wir eine große Mauer an den Grenzen des
Sicherheitsabstandes errichten. Es kommt kaum vor, dass Datenpunkte innerhalb
des Margins liegen. Je kleiner C wird, desto mehr Datenpunkte sind innerhalb
des Sicherheitsbereichs erlaubt.
Im Folgenden betrachten wir einen neuen künstlichen Datensatz, bei dem die
blauen von den roten Punkte nicht mehr ganz so stark getrennt sind. Schauen Sie
sich die fünf verschiedenen Margins an, die entstehen, wenn der Parameter C
variiert wird.
Zusammenfassung#
In diesem Abschnitt haben wir die Ideen kennengelernt, die den Support Vector Machines zugrunde liegen. Im nächsten Abschnitt schauen wir uns an, wie ein SVM-Modell mit Scikit-Learn trainiert wird.